package generics.and.colecctions.comodines;

import java.util.ArrayList;
import java.util.List;

public class Test {

	public static void main(String[] args) {
		List<?> lista1 = new ArrayList<String>();

		// lista1.add("2");

		PilaClass1<Integer> pila = new PilaClass1<Integer>();
		pila.agregar(2);

	}

	public static void volcado(PilaClass1<? extends Number> pila) {
		System.out.println(pila.recupera(0));
		// Las instancias de colecciones genéricas que utilizan el comodín como
		// parámetro de tipo no admiten operaciones de adición de objetos.

		//
		// La llamada a agregar no es correcta debido a que al declararse Pila
		// como un subtipo desconocido de Number no se puede saber si admitirá
		// números enteros.
		// pila.agregar(new Integer(1));
		Number n = new Integer(1);
		// pila.agregar(n);// Error de compilación

		// Pero sí se puede si hacemos uso de "supertipo de"
	}

	public static void volcadoComodinSuper(PilaClass1<? super Integer> pila) {
		System.out.println(pila.recupera(0));
		pila.agregar(2);
	}

}

class PilaClass1<Z> {
	private List<Z> datos;

	public PilaClass1() {
		datos = new ArrayList<Z>();
	}

	public void agregar(Z dato) {
		datos.add(dato);
	}

	public Z recupera(int posicion) {
		return datos.get(posicion);
	}
}
